﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AllegroWebAPI.Utils;

namespace AllegroWebAPI
{
    public class ContractorData : BaseAllegroExt
    {
        public ContractorData(AllegroClient a)
            : base(a)
        { 

        }

        /// <summary>
        /// Metoda pozwala sprzedającemu na dodanie informacji o przesyłce do wypełnionego przez jej adresata formularza pozakupowego (do każdego formularza dodać można maksymalnie 20 informacji o przesyłkach). 
        /// </summary>
        /// <param name="transactionId"></param>
        /// <param name="op"></param>
        /// <param name="nr"></param>
        /// <returns></returns>
        public bool AddPackageInfo(long transactionId, AllegroPackageOperator op, string nr)
        {
            List<PackageInfoStruct> pis = new List<PackageInfoStruct>();

            pis.Add(new PackageInfoStruct() { operatorId = (int)op, packageId = nr });

            var ret = aapi.WebService.doAddPackageInfoToPostBuyForm(aapi.SessionHandle, transactionId, pis.ToArray());

            return ret.packageIdsAdded.Count() == 1;
        }

        /// <summary>
        /// Metoda pozwala na pobieranie wiadomości do kupującego (której szablon tworzy wcześniej sprzedający), która dołączana jest do informacji o złożeniu oferty po każdym zakupie w ofercie.
        /// </summary>
        /// <param name="itemId">Identyfikator oferty, w której zalogowany użytkownik był kupującym</param>
        /// <returns></returns>
        public MessageToBuyerStruct GetMessageToBuyer(long itemId)
        {
            return aapi.WebService.doGetMessageToBuyer(aapi.SessionHandle, itemId);
        }

        /// <summary>
        /// Metoda pozwala na pobranie pełnych danych kontaktowych kontrahentów z danej oferty. Metoda zwraca różne dane - w zależności od tego, czy zalogowany użytkownik był sprzedającym (user-data, user-sent-to-data), czy kupującym (user-data, user-bank-accounts, company-second-address) w ramach danej oferty. W przypadku podania niepoprawnego identyfikatora oferty, zostanie dla niego zwrócona pusta struktura. 
        /// </summary>
        /// <param name="auctionIds">max 25</param>
        /// <returns></returns>
        public IEnumerable<ItemPostBuyDataStruct> GetPostBuyData(List<long> auctionIds)
        {
            return aapi.WebService.doGetPostBuyData(aapi.SessionHandle, auctionIds.ToArray());
        }

        /// <summary>
        /// Metoda pozwala kupującym na pobranie wszystkich danych z wypełnionych przez nich formularzy pozakupowych oraz dopłat do nich. Metoda zwraca także szczegółowe informacje dot. płatności (realizowanych przez PayU) powiązanych ze wskazanymi transakcjami, transakcje koszykowe (również dla wielu sprzedających), informacje nt. wybranego punktu odbioru oraz dane identyfikacyjne dot. przesyłki zawierającej produkty składające się na wskazane transakcje. W przypadku podania w wejściowej tablicy niepoprawnych identyfikatorów transakcji lub takich do których zalogowany użytkownik nie ma dostępu, są one pomijane podczas prezentowania danych wyjściowych (dane zwracane są tylko dla identyfikatorów transakcji rozpoznanych jako poprawne i należące do użytkownika będącego właścicielem danej sesji). Dodatkowo - wywołanie metody dla transakcji, w której zalogowany użytkownik był stroną sprzedającą, spowoduje zwrócenie pustej struktury. Do takich celów wykorzystywana być powinna metoda doGetPostBuyFormsDataForSellers.
        /// </summary>
        /// <param name="tranIds">Tablica identyfikatorów transakcji lub dopłat do nich (maks. 25; informacje nt. powiązania identyfikatora oferty z identyfikatorem transakcji uzyskać można za pomocą metody doGetTransactionsIDs).</param>
        /// <returns></returns>
        public IEnumerable<PostBuyFormForBuyersDataStruct> GetPostBuyFormsDataForBuyers(List<long> tranIds)
        {
            return aapi.WebService.doGetPostBuyFormsDataForBuyers(aapi.SessionHandle, tranIds.ToArray());
        }

        /// <summary>
        /// Metoda pozwala sprzedającym na pobranie wszystkich danych z wypełnionych przez kupujących formularzy pozakupowych oraz dopłat do nich. Metoda zwraca także szczegółowe informacje dot. płatności (realizowanych przez PayU) powiązanych ze wskazanymi transakcjami, informacje nt. wybranego punktu odbioru oraz dane identyfikacyjne dot. przesyłki zawierającej produkty składające się na wskazane transakcje. W przypadku podania w wejściowej tablicy niepoprawnych identyfikatorów transakcji lub takich do których zalogowany użytkownik nie ma dostępu, są one pomijane podczas prezentowania danych wyjściowych (dane zwracane są tylko dla identyfikatorów transakcji rozpoznanych jako poprawne i należące do użytkownika będącego właścicielem danej sesji). Dodatkowo - wywołanie metody dla transakcji, w której zalogowany użytkownik był stroną kupującą, spowoduje zwrócenie pustej struktury. Do takich celów wykorzystywana być powinna metoda doGetPostBuyFormsDataForBuyers.
        /// </summary>
        /// <param name="tranIds">Tablica identyfikatorów transakcji lub dopłat do nich (maks. 25; informacje nt. powiązania identyfikatora oferty z identyfikatorem transakcji uzyskać można za pomocą metody doGetTransactionsIDs).</param>
        /// <returns></returns>
        public IEnumerable<PostBuyFormDataStruct> GetPostBuyFormsDataForSellers(List<long> tranIds)
        {
            return aapi.WebService.doGetPostBuyFormsDataForSellers(aapi.SessionHandle, tranIds.ToArray());
        }

        /// <summary>
        /// Metoda pozwala na pobranie wartości identyfikatorów transakcji (zakupów sfinalizowanych wypełnieniem formularza pozakupowego przez kupującego) i dopłat do nich na podstawie przekazanych identyfikatorów ofert. Wyniki można filtrować po danych sposobach dostawy, podając podczas wywołania ich identyfikatory. Sortowanie danych wynikowych odpowiada kolejności w jakiej formularze do danej oferty zostały wypełniane (od najświeższego do najstarszego). Uzyskane identyfikatory transakcji mogą być następnie wykorzystane np. do pobierania wypełnionych formularzy pozakupowych za pomocą metod doGetPostBuyFormsDataForSellers/ForBuyers. Metoda zwraca jedynie identyfikatory transakcji, dla których - w ramach danej oferty - wypełnione zostały przez kupujących formularze pozakupowe.
        /// </summary>
        /// <param name="auctionIds">Tablica identyfikatorów ofert (maks. 25).</param>
        /// <param name="userRole">Rola użytkownika w transakcji (odpowiednia dla podanych identyfikatorów ofert). Parametr może przyjąć jedną z dwóch wartości (seller - dla sprzedającego, buyer - dla kupującego)</param>
        /// <returns></returns>
        public IEnumerable<long> GetTransactionsIDs(List<long> auctionIds, UserRole userRole)
        {
            return aapi.WebService.doGetTransactionsIDs(aapi.SessionHandle, auctionIds.ToArray(), userRole.ToString(), null);
        }

        /// <summary>
        /// Metoda pozwala na pobranie danych kontaktowych kupujących w ofertach zalogowanego użytkownika. W przypadku podania błędnego identyfikatora oferty, struktura jej odpowiadająca nie zostanie zwrócona.
        /// </summary>
        /// <param name="auctionIds"></param>
        /// <returns></returns>
        public IEnumerable<MyContactList> MyContact(List<long> auctionIds)
        {
            return aapi.WebService.doMyContact(aapi.SessionHandle, auctionIds.ToArray(), 0, 0);
        }    

    }
}
